package com.kgc.scd.controller;

import com.kgc.scd.contant.WechatPayConstant;
import com.kgc.scd.service.WechatPayService;
import com.kgc.scd.util.RequestResult;
import com.kgc.scd.util.ResultBuildUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * Created On : 2022/5/31.
 * <p>
 * Author : zhukang
 * <p>
 * Description: 微信支付操作入口
 */
@Slf4j
@RestController
public class WechatPayController {

    @Autowired
    private WechatPayService wechatPayService;

    /**
     * @author : zhukang
     * @date   : 2022/5/31
     * @param  : []
     * @return : com.kgc.scd.util.RequestResult<java.util.Map<java.lang.String,java.lang.String>>
     * @description : 请求微信官方，统一下单，返回支付连接
     */

    @PostMapping("/unifiedOrder")
    public RequestResult<Map<String, String>> wechatPayUnifiedOrder(@RequestParam String vipOrderId,
                                                                    @RequestParam String userId) throws Exception {

        // 调用业务接口，生成请求微信官方支付系统，统一下预支付订单完整接口参数（格式是xml字符串）
        String unifiedOrderParamsXml = wechatPayService.wechatPayUnifiedOrderParamsXml("vip", 1, vipOrderId,vipOrderId,userId);

        log.info("------ 1 请求微信官方，进行统一下单，接口参数：{} ------", unifiedOrderParamsXml);

        // 定义统一返回结果集
        Map<String, String> resultMap = new HashMap<>();

        // 请求微信官方统一下单接口，下预支付订单
        Map<String, String> unifiedOrderReusltMap = wechatPayService.wechatPayUnifiedOrder(unifiedOrderParamsXml);

        log.info("------ 2 请求微信官方，进行统一下单，接口返回：{} ------", unifiedOrderParamsXml);

        // 解析统一下预支付订单结果，获取支付的二维码链接，用于生成支付二维码，然后提供给用户进行扫码支付。
        if(WechatPayConstant.WECHAT_PAY_SUCCESS.equals(unifiedOrderReusltMap.get("return_code"))
                && WechatPayConstant.WECHAT_PAY_SUCCESS.equals(unifiedOrderReusltMap.get("result_code"))){

            // TODO 做签名校验，同步返回结果，省略

            // 交易类型
            resultMap.put("trade_type", unifiedOrderReusltMap.get("trade_type"));

            // 预支付交易会话标识
            resultMap.put("prepay_id", unifiedOrderReusltMap.get("prepay_id"));

            // 二维码链接
            resultMap.put("code_url", unifiedOrderReusltMap.get("code_url"));

            // 返回成功下单结果
            return ResultBuildUtil.success(resultMap);
        }

        // 返回失败下单结果
        return ResultBuildUtil.fail(unifiedOrderReusltMap.get("return_code"), unifiedOrderReusltMap.get("return_msg"));
    }

    /**
     * @author : zhukang
     * @date   : 2022/5/31
     * @param  : [javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse]
     * @return : void
     * @description : 接收微信支付结果异步回调
     */
    @RequestMapping("/wechatPayNotifyResult")
    public void wechatPayResultBack(HttpServletRequest request, HttpServletResponse response){
        // 支付完成后，微信会把相关支付结果及用户信息通过数据流的形式发送给商户，商户需要接收处理，并按文档规范返回应答。
        try(InputStream inputStream = request.getInputStream()) {

            // 读取支付回调结果
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));

            // 逐行读取
            String readLine;

            // 定义动态字符串对象，保存返回数据详情
            StringBuilder wechatPayNotifyResultXml = new StringBuilder();

            // 循环读取
            while((readLine = bufferedReader.readLine()) != null){
                wechatPayNotifyResultXml.append(readLine);
            }

            log.info("------ 3 微信官方，支付结果回调，支付结果：{} ------", wechatPayNotifyResultXml);

            // 解析异步回调支付结果，并获取同步返回给微信官方的响应
            String notifyResultResponseXml = wechatPayService.wechatPayNotifyResultResolve(wechatPayNotifyResultXml.toString());

            // 同步返回响应给微信官方
            PrintWriter out = response.getWriter();
            out.write(notifyResultResponseXml);
            out.flush();
            out.close();

            log.info("------ 4 微信官方，支付结果回调，响应结果：{} ------", notifyResultResponseXml);


        } catch (Exception ex){
            log.error("------ 5 微信官方，支付结果回调，异常：{} ------", ex.getMessage());
        }
    }

}
